跳到主要内容

MongoDB 性能优化

1. MongoDB 慢查询监控和分析

面试题1:如何在生产环境中监控 MongoDB 的慢查询?

解答要点:

// 查看当前分析级别
db.getProfilingStatus()

// 开启慢查询分析,设置阈值为100ms
db.setProfilingLevel(1, { slowms: 100 });

// 查看慢查询记录
db.system.profile.find().sort({millis: -1}).pretty()

MongoDB Profiling 级别流程:

关键配置说明:

  • Level 0: 关闭 profiling(生产环境默认)
  • Level 1: 仅记录慢操作(推荐生产环境使用)
  • Level 2: 记录所有操作(仅用于调试)
  • slowms: 慢查询阈值,通常设置为 100-300ms

面试题2:如何分析 MongoDB 慢查询的根本原因?

解答要点:

// 查看慢查询统计
db.system.profile.aggregate([
{
$group: {
_id: {
ns: "$ns",
op: "$op",
query: "$query"
},
count: {$sum: 1},
avgMillis: {$avg: "$millis"},
totalMillis: {$sum: "$millis"}
}
},
{$sort: {count: -1}},
{$limit: 10}
])

慢查询分析时序图:

2. MongoDB 索引优化

面试题3:如何分析 MongoDB 的索引使用情况?

解答要点:

// 检查索引使用统计
db.collection_name.aggregate([
{ $indexStats: {} }
])

// 检查执行计划
db.collection_name.find({查询条件}).explain("executionStats")

索引分析流程:

面试题4:请解释 MongoDB 执行计划中的关键指标

解答要点:

根据提供的执行计划分析:

// 关键指标解释:
{
"stage": "IXSCAN", // 索引扫描(好)
"indexName": "appId_1_time_-1", // 使用的索引
"executionTimeMillis": 0, // 执行时间
"totalKeysExamined": 6, // 扫描索引条目数
"totalDocsExamined": 6, // 扫描文档数
"nReturned": 6 // 返回文档数
}

执行计划分析时序图:

性能指标说明:

  • nReturned/totalDocsExamined 比例接近1表示索引效率高
  • COLLSCAN 表示全表扫描,需要优化
  • executionTimeMillis 执行时间应该控制在合理范围内

面试题5:在高并发场景下,如何设计 MongoDB 复合索引?

解答要点:

// 复合索引设计原则(ESR规则)
// 1. Equality(等值查询)放在前面
// 2. Sort(排序)放在中间
// 3. Range(范围查询)放在最后

// 示例:对于查询 {appId: xxx, chatId: xxx, time: {$gte: date}}
db.collection.createIndex({
appId: 1, // Equality
chatId: 1, // Equality
time: -1 // Range/Sort
})

复合索引选择流程:

3. MongoDB 查询优化实战

面试题6:如何优化一个包含多个条件的复杂查询?

优化步骤时序图:

面试题7:MongoDB 分片环境下的查询优化策略是什么?

分片查询优化流程:

优化策略:

  1. 查询条件尽量包含片键(shard key)
  2. 避免跨分片的排序和聚合操作
  3. 使用 hint() 指定合适的索引
  4. 合理设计片键,避免热点分片

这些面试题涵盖了 MongoDB 性能优化的核心概念,从基础的慢查询监控到高级的分片优化策略,能够全面考察候选人的 MongoDB 实战能力。